package cn.dao;

import cn.entity.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author Mxb
 * @version 1.0
 * @date 2020/9/19 10:40
 * JpaRepository<操作实体类类型，主键类型>：用来完成基本CRUD操作
 * JpaSpecificationExecutor<操作实体类类型>：用于复杂查询（分页等查询操作）
 */
public interface CustomerDao extends JpaRepository<Customer, Long>,
        JpaSpecificationExecutor<Customer> {

    //@Query 使用jpql的方式查询。
    @Query(value = "from Customer")
    public List<Customer> findAllCustomer();

    //@Query 使用jpql的方式查询。?1代表参数的占位符，其中1对应方法中的参数索引
    @Query(value = "from Customer where custName = ?1")
    public Customer findCustomer(String custName);

    // 对于多个占位符参数
    // 赋值的时候，默认的情况下，占位符的位置需要和方法参数中的位置保持一致
    //@Query 使用jpql的方式更新
    @Query(value = "update Customer set custName = ?1 where custId = ?2")
    @Modifying //用 @Modifying 来将该操作标识为修改查询
    @Transactional //需要加事务
    public void updateCustomer(String custName, Long custId);


    /**
     * nativeQuery : 是否使用本地sql的方式查询
     */
    @Query(value = "select * from cst_customer", nativeQuery = true)
    public List<Customer> findAllSql();

    /**
     * nativeQuery : 是否使用本地sql的方式查询
     */
    @Query(value = "select * from cst_customer where cust_name=? and cust_id = ?"
            , nativeQuery = true)
    public Customer findByCustNameID(String custName, Long id);


    //方法命名方式查询（根据客户名称查询客户）
    public Customer findByCustName(String custName);


    //方法命名方式   进行模糊查询
    public List<Customer> findByCustNameLike(String custName);

    // 使用客户名称模糊匹配和客户所属行业精准匹配的查询
    public Customer findByCustNameLikeAndCustLevel(String custName,String custLevel);

}
